package com.eas.ui; import java.util.logging.Level; import java.util.logging.Logger; import com.eas.core.HasPublished; import com.eas.core.Utils; import com.eas.ui.events.AddEvent; import com.eas.ui.events.AddHandler; import com.eas.ui.events.EventsExecutor; import com.eas.ui.events.HasAddHandlers; import com.eas.ui.events.HasRemoveHandlers; import com.eas.ui.events.RemoveEvent; import com.eas.ui.events.RemoveHandler; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.event.logical.shared.HasSelectionHandlers; import com.google.gwt.event.logical.shared.SelectionEvent; import com.google.gwt.event.logical.shared.SelectionHandler; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.ui.HasValue; import com.google.gwt.user.client.ui.UIObject; public class ButtonGroup extends RadioGroup implements HasJsFacade, HasAddHandlers, HasRemoveHandlers, HasSelectionHandlers<UIObject> { protected String name; protected JavaScriptObject published; protected JavaScriptObject onItemSelected; public ButtonGroup() { super(); addSelectionHandler(new SelectionHandler<UIObject>() { @Override public void onSelection(SelectionEvent<UIObject> event) { if (onItemSelected != null) { try { JavaScriptObject jsItem = event.getSelectedItem() instanceof HasPublished ? ((HasPublished)event.getSelectedItem()).getPublished() : null; Utils.executeScriptEventVoid(published, onItemSelected, EventsPublisher.publishItemEvent(published, jsItem)); } catch (Exception e) { Logger.getLogger(EventsExecutor.class.getName()).log(Level.SEVERE, null, e); } } } }); } public JavaScriptObject getItemSelected() { return onItemSelected; } public void setItemSelected(JavaScriptObject aValue) { onItemSelected = aValue; } @Override public HandlerRegistration addAddHandler(AddHandler handler) { return addHandler(handler, AddEvent.getType()); } @Override public HandlerRegistration addRemoveHandler(RemoveHandler handler) { return addHandler(handler, RemoveEvent.getType()); } @Override public String getJsName() { return name; } @Override public void setJsName(String aValue) { name = aValue; } public JavaScriptObject getPublished() { return published; } public void add(HasPublished aItem) { if (aItem instanceof HasValue<?>) { super.add((HasValue<Boolean>) aItem); if (aItem instanceof HasPlatypusButtonGroup) { ((HasPlatypusButtonGroup) aItem).mutateButtonGroup(this); AddEvent.fire(this, (UIObject) aItem); } } } public void remove(HasPublished aItem) { if (aItem instanceof HasValue<?>) { super.remove((HasValue<Boolean>) aItem); if (aItem instanceof HasPlatypusButtonGroup) { ((HasPlatypusButtonGroup) aItem).setButtonGroup(null); RemoveEvent.fire(this, (UIObject) aItem); } } } public HasPublished getChild(int i) { HasValue<Boolean> child = super.get(i); if (child instanceof HasPublished) return (HasPublished) child; else return null; } @Override public HandlerRegistration addSelectionHandler(SelectionHandler<UIObject> handler) { return addHandler(handler, SelectionEvent.getType()); } @Override public void onValueChange(ValueChangeEvent<Boolean> event) { super.onValueChange(event); SelectionEvent.fire(this, (UIObject) event.getSource()); } @Override public void setPublished(JavaScriptObject aValue) { if (published != aValue) { published = aValue; if (published != null) { publish(this, aValue); } } } private native static void publish(HasPublished aWidget, JavaScriptObject published)/*-{ published.add = function(toAdd){ if(toAdd && toAdd.unwrap) { if(toAdd.buttonGroup == published) throw 'A widget already added to this group'; aWidget.@com.eas.ui.ButtonGroup::add(Lcom/eas/core/HasPublished;)(toAdd.unwrap()); } } published.remove = function(toRemove) { if(toRemove && toRemove.unwrap) { aWidget.@com.eas.ui.ButtonGroup::remove(Lcom/eas/core/HasPublished;)(toRemove.unwrap()); } } published.clear = function() { aWidget.@com.eas.ui.ButtonGroup::clear()(); } published.child = function(aIndex) { var comp = aWidget.@com.eas.ui.ButtonGroup::getChild(I)(aIndex); return @com.eas.core.Utils::checkPublishedComponent(Ljava/lang/Object;)(comp); }; Object.defineProperty(published, "children", { value : function() { var ch = []; for(var i = 0; i < published.count; i++) ch.push(published.child(i)); return ch; } }); Object.defineProperty(published, "count", { get : function() { return aWidget.@com.eas.ui.ButtonGroup::size()(); } }); Object.defineProperty(published, "name", { get : function() { return aWidget.@com.eas.ui.HasJsName::getJsName()(); } }); Object.defineProperty(published, "onItemSelected", { get : function() { return aWidget.@com.eas.ui.ButtonGroup::getItemSelected()(); }, set : function(aValue) { aWidget.@com.eas.ui.ButtonGroup::setItemSelected(Lcom/google/gwt/core/client/JavaScriptObject;)(aValue); }, configurable : true }); }-*/; }